package com.hd.swagger0411.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
//springboot 方式的过滤器
public class LookLookHeaderFilter2 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=UTF-8");
        Map<String, Object> map = new HashMap<>();
        //请求参数
        Enumeration<String> parameterNames = req.getParameterNames();
        //所有请求头
        Enumeration<String> headerNames = req.getHeaderNames();
        //请求体
        /**
         * 通过HttpServletRequest对象的getReader()方法获取HTTP请求的请求体流
         * 使用getReader()方法返回的BufferedReader对象的lines()方法逐行读取请求体的内容，
         * 再利用reduce()方法将读取到的每一行请求体拼接成一个完整的字符串。最后，将请求体字符串赋值给变量body。
         *
         * etReader()方法获取到的是一个字符流BufferedReader，
         * 该对象中有一个lines()方法，用于返回一个Stream<String>对象，包含所有读取到的字符串。
         * 使用reduce()方法将各行字符串拼接时，
         * 第一个参数""即为拼接的初始值，第二个参数(actual, accumulator) -> accumulator + actual
         * 则表示将每行字符串添加到累加器accumulator中。由于HTTP请求体可能很大，因此使用流的方式优化性能。
         */
        String body = req.getReader().lines().reduce("", (accumulator, actual) -> accumulator + actual);
        //请求路径
        StringBuffer requestURL = req.getRequestURL();
        map.put("请求参数", Collections.list(parameterNames));
        map.put("请求头:", Collections.list(headerNames));
        map.put("请求体", body);
        map.put("url:", requestURL);
        resp.getWriter().println(map);
    }
}
